package com.sq.partner.manager.util;

import java.util.HashMap;
import java.util.Map;

public class IdCardUtil {

// 经过计算得出的指数数组，算法：２的ｎ-1次方求和，除以11取模

// 如：2的0次方除以11取模=1,2的1次方除以11取模=2,2的2次方除以11取模=4

    static int[] wi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};

// 校验位数组

    static char[] ai = {'1', '0', 'x', '9', '8', '7', '6', '5', '4', '3', '2'};
    
    /**
     * 根据身份证号获取生日
     * @param card_no
     * @return
     */
    public static String getBirthdayFromCard(String card_no){
    	String birthday = "";
    	String emp="1234567890xX";
    	for(int i=0;i<card_no.length();i++){
			if(emp.indexOf(""+card_no.substring(i, i+1))==-1){
				return "";
			}
		}
    	if(card_no.length() == 15){
    		birthday = "19"+card_no.substring(6, 8)+"-";
    		birthday = birthday + card_no.substring(8, 10)+"-";
    		birthday = birthday + card_no.substring(10, 12);
    	}else if(card_no.length() == 18){
    		birthday = card_no.substring(6, 10)+"-";
    		birthday = birthday + card_no.substring(10, 12)+"-";
    		birthday = birthday + card_no.substring(12, 14);
    	}
    	
    	return birthday ;
    }
    
    /**
     * 根据15位身份证号和出生日期计算得出18位身份证号
     *
     * @param lowerId，15位身份证号
     * @param birthday出生日期，19810912
     * @return upperId，返回18位身份证号
     */

    public static String upperIdNumber(String lowerId, String birthday) {

        if (lowerId.length() != 15) {

            return "请录入15位身份证号码。";

        } else {

            return lowerId.substring(0, 6) + birthday.substring(0, 2)

                + lowerId.substring(6) + ai[checkBit(lowerId, birthday)];

        }

// return lowerId+ai[checkBit("372832198109126616")];

    }

    /**
     * 根据15位身份证号和出生日期，计算校验位
     *
     * @param lowerId，15位身份证号
     * @param birthday出生日期，19810912
     * @return mod，第18位校验位，用于从ai数组取数作为身份证号的最后一位，即ai[mod]
     */

    public static int checkBit(String lowerId, String birthday) {

        if (lowerId.length() != 15) { // 请录入15位身份证号码

            return -1;
        }

        lowerId = lowerId.substring(0, 6) + birthday.substring(0, 2)

            + lowerId.substring(6);

        int sum = 0;

// 计算校验位，前 17位加权求和，然后除以11取模

        for (int i = 1; i < lowerId.length() + 1; i++) {

            sum = sum + wi[i - 1]* (Integer.parseInt(lowerId.substring(i - 1, i)));

        }



// 计算校验位end

        int mod = sum % 11;

        return mod;

    }

    /**
     * 根据传入的１８位身份证号，计算校验位
     *
     * @param ｉd，１８位身份证号
     * @return mod，返回校验位，用于从ai数组取数作为身份证号的最后一位，即ai[mod]
     */

    public static String checkBit(String id) {
        String lowerId = id.substring(0, 17);
        int sum = 0;
        for (int i = 1; i < lowerId.length() + 1; i++) {
            sum = sum + wi[i - 1]* (Integer.parseInt(lowerId.substring(i - 1, i)));
        }
        int mod = sum % 11;
        return ai[mod]+"";

    }

    /**
     * 校验身份证号
     *
     * @param id 身份证号，包括15位和18位
     * @param birthday出生日期8位(20071207)
     * @param sex，性别,男为奇数，女为偶数
     * @return result，返回身份证号是否正确
     */

    public static String checkIdNumber(String id, String birthday, String sex) {

        String result = "";

        int len = id.length();

        if (len == 15) {

// 调用15位身份证号校验方法

            result = checkId_15(id, birthday, sex);


        } else if (len == 18) {

// 调用18位身份证号校验方法

            result = checkId_18(id, birthday, sex);


        } else {

            result = "false|身份证号长度错误，只能是15位或18位。";

        }

        return result;

    }

    /**
     * 校验15位身份证号
     *
     * @param id
     * 15位身份证号
     * @param birthday出生日期8位(20071207)
     * @param sex，性别,男为奇数，女为偶数
     * @return result
     */

    public static String checkId_15(String id, String birthday, String sex) {

        String result = "";

        String birth_id = id.substring(6, 12); // 6位日期

        String birth = birthday.substring(2);

        if (birth_id.equals(birth)) {

// 检验日期，出生日期与身份证中的出生日期相符，然后检验性别

            if (sex.equals("男")) {

// 性别为男，最后一位是奇数

                String temp = id.substring(14); // 最后一位代表性别
                int isex = Integer.parseInt(temp);

                if (isex % 2 == 1) { // 除2余数为1

                    result = "true|身份证号通过验证。";

                } else {

                    result = "false|身份证号与性别不相符。";

                }

            } else if (sex.equals("女")) {

// 性别为女，最后一位是偶数

                String temp = id.substring(14); // 最后一位代表性别

                int isex = Integer.parseInt(temp);

                if (isex % 2 == 0) { // 除2余数为0

                    result = "true|身份证号通过验证。";

                } else {

                    result = "false|身份证号与性别不相符。";

                }

            } else {

                result = "false|性别录入错误。";

            }

        } else {

// 出生日期与身份证中的出生日期不相符

            result = "false|出生日期与身份证中的出生日期不相符。";

        }

        return result;

    }
    
    /**
     * 校验18位身份证号
     *
     * @param id
     * 18位身份证号
     * @param birthday出生日期8位(20071207)
     * @param sex，性别,男为奇数，女为偶数
     * @return result
     */
    public static String checkId_18(String id, String birthday, String sex) {

        String result = "";

        String birth_id = id.substring(6, 14); // 8位日期

        if (birth_id.equals(birthday)) {

// 检验日期，出生日期与身份证中的出生日期相符，然后检验性别

            if (sex.equals("男")) {

// 性别为男，最后一位是奇数

                String temp = id.substring(16, 17); // 倒数第二位代表性别

                int isex = Integer.parseInt(temp);

                if (isex % 2 == 1) { // 除2余数为1

                    result = "true|身份证号通过验证。";

                } else {

                    result = "false|身份证号与性别不相符。";

                }

            } else if (sex.equals("女")) {

// 性别为女，最后一位是偶数

                String temp = id.substring(16, 17); // 倒数第二位代表性别

                int isex = Integer.parseInt(temp);

                if (isex % 2 == 0) { // 除2余数为0

                    result = "true|身份证号通过验证。";

                } else {

                    result = "false|身份证号与性别不相符。";

                }

            } else {

                result = "false|性别录入错误。";

            }

        } else {

// 出生日期与身份证中的出生日期不相符

            result = "false|出生日期与身份证中的出生日期不相符。";

        }

        return result;

    }
    
    public static Map<String,String> get_15Id(String id){
    	String sexCode=id.substring(14);
    	String birthday=id.substring(6, 12);
    	Map<String,String> map=new HashMap<String, String>();
    	map.put("sex", getSex(sexCode));
    	map.put("bir", birthday);
		return map;
    }
    public static Map<String,String> get_18Id(String id){
    	String sexCode=id.substring(16, 17);
    	String birthday=id.substring(6, 14);
    	Map<String,String> map=new HashMap<String, String>();
    	map.put("sex", getSex(sexCode));
    	map.put("bir", birthday);
		return map;
    }
    public static String getSex(String sexCode){
    	int isex = Integer.parseInt(sexCode);
        if (isex % 2 == 1) {
            	return "1";
        }
		return "0";
    	
    }
    
    public static Map<String,String> get_15IdNew(String id){
    	String sexCode=id.substring(14);
    	String birthday=id.substring(6, 12);
    	Map<String,String> map=new HashMap<String, String>();
    	map.put("sex", getSex(sexCode));
    	map.put("bir", birthday);
		return map;
    }
    public static Map<String,String> get_18IdNew(String id){
    	String sexCode=id.substring(16, 17);
    	String birthday=id.substring(6, 14);
    	Map<String,String> map=new HashMap<String, String>();
    	map.put("sex", getSex(sexCode));
    	map.put("bir", birthday);
		return map;
    }
    public static String getSexNew(String sexCode){
    	int isex = Integer.parseInt(sexCode);
        if (isex % 2 == 1) {
            	return "1";
        }
		return "2";
    	
    }
    /**
     * 得到身份证出生日期
     * @param 
     * @return 
     */
    public static String getIdBir(String id) {
    		Map<String,String> map=	getIdData(id);
    		if(null==map){
        		return null;
        	}
			return map.get("bir");
    }
    /**
     * 得到身份证性别
     * @param id
     * @return 1为男士,0为女士
     */
    public static String getIdSex(String id) {
    	Map<String,String> map=	getIdData(id);
    	if(null==map){
    		return null;
    	}
		return map.get("sex");
    }
    /**
     * 
     * @param id
     * @return 1为男，2为女 
     */
    public static String getIdSexNew(String id) {
    	Map<String,String> map=	getIdDataNew(id);
    	if(null==map){
    		return null;
    	}
		return map.get("sex");
    }
    /**
     * 判断身份证是否合法
     * @param id
     * @return 合法返回true 非法返回false
     */
    public static boolean clickCardNumber(String id){
    	if(PatternUtil.idCardNumber(id)){
    		if (id.length() == 15) {
    			return true;
    		}else{
    			String bit= checkBit(id);
    			String sexCode=id.substring(17);
    			if(bit.equals(sexCode.toLowerCase())){
    				return true;
    			}else{
    				return false;
    			}
    		}
    	}else{
    		return false;
    	}
		
    }
    public static Map<String,String> getIdData(String id) {
    	Map<String,String> map=null;
    	if(clickCardNumber(id)){
    		int len= id.length();
    		if (len == 15) {
    			map=get_15Id(id);
    		}else{
    			map=get_18Id(id);
    		}
    	}
		return map;
}
    
    public static Map<String,String> getIdDataNew(String id) {
    	Map<String,String> map=null;
    	if(clickCardNumber(id)){
    		int len= id.length();
    		if (len == 15) {
    			map=get_15IdNew(id);
    		}else{
    			map=get_18IdNew(id);
    		}
    	}
		return map;
}

}